/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package sp2p.util;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.PrintWriter;
import java.net.Socket;
import sp2p.peerToPeer.Peer;

/**
 *
 * @author aline
 */
public class ReceiveViaTCP {
    /**
     * Metodo que recebe arquivo para download
     * @param peer - dono do arquivo que sera feito o download
     * @param arquivoParaDownload - arquivo para download
     */
    public void receberArquivo(Peer peer, String arquivoParaDownload) {
        try {
            Socket cliente = new Socket(peer.getServidor().getServidor().getInetAddress(), peer.getServidor().getServidor().getLocalPort());
            System.out.println("[Conexao aceita de: " + peer.getServidor().getIp().toString() + "]");
            System.out.println("[Recebendo arquivo '" + arquivoParaDownload + "'");
//            Socket cliente = new Socket(peer.getServidor().getIp(), peer.getServidor().getServidor().getLocalPort());
//            System.out.println("[Conexao aceita de: " + peer.getServidor().getIp()+ "]");
//            System.out.println("[Recebendo arquivo '" + arquivoParaDownload + "'");
            // abertura do arquivo
            BufferedInputStream arquivo = new BufferedInputStream(new FileInputStream(arquivoParaDownload));
            // abertura de canal modo texto
            PrintWriter saidaTexto = new PrintWriter(cliente.getOutputStream(), true);
            // obtenção e envio dos dados do arquivo
            File file = new File(arquivoParaDownload);
            saidaTexto.println(file.getName());
            long sent = 0;
            long total = file.length();
            saidaTexto.println(total + "");
            // fecha canal modo texto
            saidaTexto.close();
            // fecha conexao
            cliente.close();
            // reabre conexao
            cliente = new Socket(peer.getServidor().getServidor().getInetAddress(), peer.getServidor().getServidor().getLocalPort());
            // abertura canal binario
            BufferedOutputStream saidaBin = new BufferedOutputStream(cliente.getOutputStream());
            while (sent + 256 < total) {
                // cria array para bloco
                byte[] dados = new byte[256];
                // le dados para bloco
                arquivo.read(dados, 0, 256);
                // envia bloco
                saidaBin.write(dados, 0, 256);
                // totaliza blocos
                sent += 256;
            }
            if (sent < total) {
                int fim = (int) (total - sent);
                //cria array para bloco final
                byte dados[] = new byte[fim];
                // le dados para bloco final
                arquivo.read(dados, 0, fim);
                // envia bloco final
                saidaBin.write(dados, 0, fim);
            }
            // fecha canal binario
            saidaBin.close();
            // fecha arquivo
            arquivo.close();
            System.out.println("[" + total + " bytes enviados]");
            // fecha conexao
            cliente.close();
            System.out.println("[Conexao encerrada]");
        } catch (Exception e) {
            System.out.println("Erro!\n");
            e.printStackTrace();
        }
    }
}